//package com.ls.fw.index.test;
//
//import java.io.File;
//import java.io.IOException;
//import java.io.StringReader;
//import java.io.UnsupportedEncodingException;
//import java.sql.Time;
//import java.sql.Timestamp;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import java.util.Map;
//
//import org.apache.lucene.analysis.Analyzer;
//import org.apache.lucene.analysis.TokenStream;
//import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
//import org.apache.lucene.document.Document;
//import org.apache.lucene.document.Field;
//import org.apache.lucene.document.Fieldable;
//import org.apache.lucene.document.NumericField;
//import org.apache.lucene.index.CorruptIndexException;
//import org.apache.lucene.index.IndexReader;
//import org.apache.lucene.index.IndexWriter;
//import org.apache.lucene.index.IndexWriterConfig;
//import org.apache.lucene.index.Term;
//import org.apache.lucene.search.BooleanQuery;
//import org.apache.lucene.search.IndexSearcher;
//import org.apache.lucene.search.NumericRangeQuery;
//import org.apache.lucene.search.Query;
//import org.apache.lucene.search.ScoreDoc;
//import org.apache.lucene.search.Sort;
//import org.apache.lucene.search.SortField;
//import org.apache.lucene.search.TermQuery;
//import org.apache.lucene.search.TermRangeQuery;
//import org.apache.lucene.search.TopDocs;
//import org.apache.lucene.search.WildcardQuery;
//import org.apache.lucene.search.BooleanClause.Occur;
//import org.apache.lucene.search.highlight.Fragmenter;
//import org.apache.lucene.search.highlight.Highlighter;
//import org.apache.lucene.search.highlight.QueryScorer;
//import org.apache.lucene.search.highlight.SimpleHTMLFormatter;
//import org.apache.lucene.search.highlight.SimpleSpanFragmenter;
//import org.apache.lucene.store.Directory;
//import org.apache.lucene.store.FSDirectory;
//import org.apache.lucene.util.Version;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.wltea.analyzer.lucene.IKAnalyzer;
//
//import com.harzone.investigate.common.Constant;
//import com.harzone.investigate.model.Caseinfo;
//import com.harzone.investigate.model.Userstable;
//import com.harzone.investigate.util.BeanParameterUtil;
//import com.harzone.investigate.util.PropertiesUtil;
//import com.harzone.projectName.common.ColumnObj;
//import com.harzone.projectName.common.OrderObj;
//import com.harzone.projectName.exception.MyException;
//import com.harzone.projectName.util.PageBean;
//
//
//public abstract class BaseIndexDAOImpl<T> implements IBaseIndexDAO<T> {
//	
//	protected Logger logger = LoggerFactory.getLogger(this.getClass());
//	
//	private Directory dir = null;
//	private IndexWriter writer = null;
//	
//	
//	public BaseIndexDAOImpl() throws MyException {
//		this.open();
//	}
//	
//	@Override
//	public List<T> query(PageBean bean, ColumnObj[] column
//			,OrderObj[] order,boolean isSearch,String keyword,boolean isHigh) throws MyException {
//		if(!Constant.isOpenIndex()){
//			return null;
//		}
//		int firstResult = (bean.getPage() - 1) * bean.getPageSize();
//		if(firstResult<0){
//			firstResult = 0;
//		}
//		int maxResult = bean.getPageSize();
//		if (!new File(getPath()).exists()) {
//			bean.setSize(0);
//			bean.setPage(0);
//		}
//		IndexReader reader = null;
//		try {
//			reader = IndexReader.open(dir);
//		} catch (CorruptIndexException e) {
//			e.printStackTrace();
//			throw new MyException(e.getMessage());
//		} catch (IOException e) {
//			e.printStackTrace();
//			throw new MyException(e.getMessage());
//		}
//		IndexSearcher searcher = new IndexSearcher(reader);
//		if(maxResult<=0){
//			maxResult = searcher.maxDoc();
//			bean.setPageSize(maxResult);
//		}
//		BooleanQuery boolQuery = this.getQuery(column, isSearch, keyword);
//		Sort sort = null;
//		//if(column==null){
//		   sort = this.getSort(order, isSearch);
//		//}
//		List<T> list = new ArrayList<T>();
//		try{
//			// 开始查询
//		    int n = firstResult + maxResult;
//		    //logger.debug("全文搜索条件："+boolQuery.toString());
////		    System.out.println("全文搜索条件："+boolQuery.toString());
////		    System.out.println("order条件："+sort);
////		    System.out.println("pageSize："+n);
//		    TopDocs topDocs = null;
//		    if(sort==null){
//		    	topDocs = searcher.search(boolQuery, null, n);
//			}else{
//				topDocs = searcher.search(boolQuery, null, n , sort);
//			}
//			int totalCount = topDocs.totalHits;// 总记录数
//			 //System.out.println("totalCount："+totalCount);
//			ScoreDoc[] hits = topDocs.scoreDocs;
//			int length = Math.min(firstResult + maxResult, hits.length);
//			boolean high = false;
//			if(isSearch){
//				//if((keyword!=null && !"".equals(keyword)) || isHigh){
//				if(isHigh){
//					high =  true;
//				}
//			}
//			for (int i = firstResult; i < length; i++) {
//				int DocId = hits[i].doc;
//				Document doc1 = searcher.doc(DocId);
//				T obj = mapper(doc1,boolQuery,high);
//				//System.out.println(obj);
//				list.add(obj);
//			}
//			bean.setSource(list);
//			bean.setSize(totalCount);
//		}catch (Exception e) {
//			e.printStackTrace();
//			throw new MyException(e.getMessage());
//		}finally{
//			if(reader!=null){
//				try {
//					reader.close();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
//		}
//		return list;
//	}
//	
//	public int getSize(ColumnObj[] column,OrderObj[] order,boolean isSearch,String keyword) throws MyException{
//		int size = 0;
//		if(!Constant.isOpenIndex()){
//			return size;
//		}
//		IndexReader reader = null;
//		try {
//			reader = IndexReader.open(dir);
//		} catch (CorruptIndexException e) {
//			e.printStackTrace();
//			throw new MyException(e.getMessage());
//		} catch (IOException e) {
//			e.printStackTrace();
//			throw new MyException(e.getMessage());
//		}
//		IndexSearcher searcher = new IndexSearcher(reader);
//		if(column==null && !isSearch){
//			size = searcher.maxDoc();
//			return size;
//		}
//		if(isSearch && (keyword==null||"".equals(keyword))){
//			size = searcher.maxDoc();
//			return size;
//		}
//		BooleanQuery boolQuery = this.getQuery(column, isSearch, keyword);
//		Sort sort = null;// this.getSort(order, isSearch);
//		try{
//		   // logger.debug("全文搜索条件："+boolQuery.toString());
////			System.out.println("全文搜索条件："+boolQuery.toString());
////			System.out.println("order条件："+sort);
//		    //System.out.println(searcher.maxDoc());
//		    TopDocs topDocs = null;
//		    if(sort==null){
//		    	topDocs = searcher.search(boolQuery, null, searcher.maxDoc());
//			}else{
//				topDocs = searcher.search(boolQuery, null, searcher.maxDoc() , sort);
//			}
//		    size = topDocs.totalHits;// 总记录数
//		    //System.out.println("totalCount："+size);
//		}catch (Exception e) {
//			e.printStackTrace();
//			throw new MyException(e.getMessage());
//		}finally{
//			if(reader!=null){
//				try {
//					reader.close();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
//		}
//		return size;
//	}
//	
//	
//	private Highlighter getHighlighter(Query query){
//		   /**自定义标注高亮文本标签*/  
//        SimpleHTMLFormatter formatter = new SimpleHTMLFormatter("<font color=\"red\">","</font>");  
//        /**创建QueryScorer*/  
//        QueryScorer scorer=new QueryScorer(query);  
//        /**创建Fragmenter*/  
//        Fragmenter fragmenter = new SimpleSpanFragmenter(scorer);  
//        Highlighter highlight=new Highlighter(formatter,scorer);  
//        highlight.setTextFragmenter(fragmenter);
//        return highlight;
//	}
//	
//	
//	private BooleanQuery getQuery(ColumnObj[] column,boolean isSearch,String keyword){
//		Analyzer analyzer =  this.getAnalyzer();
//		BooleanQuery boolQuery = new BooleanQuery();
//		//BooleanQuery boolQuerys = new BooleanQuery();
//		BooleanQuery boolQuerycasename = new BooleanQuery();
//		Boolean queryStatus = false;
//		boolean existCondition = false; 
//		if (isSearch) {
//			if(keyword!=null && !"".equals(keyword)){
//				String value = keyword;
//				try {
//					value = java.net.URLDecoder.decode(keyword,"UTF-8");
//				} catch (UnsupportedEncodingException e1) {
//					e1.printStackTrace();
//					value = keyword;
//				}
//				String[] keys = value.split("\\s+");
//				Object obj = getModel();
//				if(keys!=null){;
//					for (String string : keys) {
//						queryStatus = true;
//						existCondition = true;
//						BeanParameterUtil.setValueForFullField(boolQuerycasename, string, obj);
//					}
//				}
//				if(value.indexOf("?")>-1){
//					String[] strs = value.split("\\?");
//					for (String string : strs) {
//						if(string!=null && !"".equals(string)){
//							queryStatus = true;
//							existCondition = true;
//							BeanParameterUtil.setValueForFullField(boolQuerycasename, string, obj);
//						}
//					}
//				} 
//			}
//				
//			boolean isToken = true;
//			if(isToken && keyword!=null && !"".equals(keyword)){
//				TokenStream tokenStream = null;
//				try {
//					tokenStream = analyzer.tokenStream("queryname", new StringReader(String.valueOf(keyword)));
//					tokenStream.addAttribute(CharTermAttribute.class);
//					while (tokenStream.incrementToken()) {
//						queryStatus = true;
//						existCondition = true;
//						CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
//	//					Term term = new Term(col.getColumnName(), "*" + new String(charTermAttribute.toString()) + "*");
//	//					Query query = new WildcardQuery(term);
//	//					boolQuerycasename.add(query, Occur.SHOULD);
//						List<String> list = this.getTokenName();
//						if(list!=null){
//							for (String string : list) {
//								Term term = new Term(string, "*" + new String(charTermAttribute.toString()) + "*");
//								Query query = new WildcardQuery(term);
//								boolQuerycasename.add(query, Occur.SHOULD);
//							}
//						}
//					}
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
//		}
//		if(column!=null && column.length>0){
//			int length = column.length;
//			boolean token = true;
//			for (int i = 0; i < length; i++) {
//				ColumnObj  col = column[i];
//				String value = "";
//				try {
//					value = java.net.URLDecoder.decode(String.valueOf(col.getValue()),"UTF-8");
//				} catch (UnsupportedEncodingException e1) {
//					e1.printStackTrace();
//					value = String.valueOf(column[i].getValue());
//				}
//				if (isTokenName(col.getColumnName())) {
//					Term term1=new Term(col.getColumnName(),"*"+value+"*");
//					//模糊查询器
//					Query query1=new WildcardQuery(term1);
//					existCondition = true;
//					queryStatus = true;
//					if(token){
//						boolQuerycasename.add(query1, Occur.SHOULD);
//						TokenStream tokenStream = null;
//						//boolean hasToken =  false;
//						try {
//							tokenStream = analyzer.tokenStream("queryname", new StringReader(String.valueOf(value)));
//							tokenStream.addAttribute(CharTermAttribute.class);
//							while (tokenStream.incrementToken()) {
//								queryStatus = true;
//								existCondition = true;
//								CharTermAttribute charTermAttribute = tokenStream.getAttribute(CharTermAttribute.class);
//								Term term = new Term(col.getColumnName(), "*" + new String(charTermAttribute.toString()) + "*");
//								Query query = new WildcardQuery(term);
//								boolQuerycasename.add(query, Occur.SHOULD);
//							}
//						} catch (IOException e) {
//							e.printStackTrace();
//						}
//					}else{
//						boolQuery.add(query1, Occur.MUST);
//					}
//					 
//				}else if (isSearchName(col.getColumnName())) {
//					existCondition = true;
//					Query query = null;
//					if("like".equals(col.getOpeator())){
//						String val = String.valueOf(value);
//						if(val!=null && !"".equals(val)){
//							if(val.indexOf("?")>-1){
//								String[] strs = val.split("\\?");
//								for (String string : strs) {
//									if(string!=null && !"".equals(string)){
//										queryStatus = true;
//										Term term = new Term(col.getColumnName(), "*" + string + "*");
//										Query query1 = new WildcardQuery(term);
//										boolQuerycasename.add(query1, Occur.SHOULD);
//									}
//								}
//							}else{
//								Term term = new Term(col.getColumnName(),"*"+String.valueOf(value)+"*");
//								query = new WildcardQuery(term);
//							}
//						}
//						
//					}else if("between".equals(col.getOpeator())){
//						String begintime = String.valueOf(value);
//						String endtime = String.valueOf(col.getValue1());
//						//System.out.println(col);
//						if("time".equals(col.getFlag())
//						   ||"long".equals(col.getFlag())
//						   ||"date".equals(col.getFlag())
//						   ||"datetime".equals(col.getFlag())){
//							Long min = 0L,max = 0L;
//							try{
//								min = Long.parseLong(begintime);
//							}catch (Exception e) {
//								min = Long.MIN_VALUE;
//							}
//							try{
//								max = Long.parseLong(endtime);
//							}catch (Exception e) {
//								max = Long.MAX_VALUE;
//							}
//							query = NumericRangeQuery.newLongRange(col.getColumnName(), min, max, true, true);
//						}else if("int".equals(col.getFlag())){
//							Integer min = 0,max = 0;
//							try{
//								min = Integer.parseInt(begintime);
//							}catch (Exception e) {
//								min = Integer.MIN_VALUE;
//							}
//							try{
//								max = Integer.parseInt(endtime);
//							}catch (Exception e) {
//								min = Integer.MAX_VALUE;
//							}
//							query = NumericRangeQuery.newIntRange(col.getColumnName(),min, max, true, true);
//						}else{
//							query = new TermRangeQuery(col.getColumnName(),begintime, endtime, true, true);  
//						}
//					}else{
//						if("or".equals(col.getWhereType())){
//							queryStatus = true;
//							existCondition = true;
//							query = new TermQuery(new Term(col.getColumnName(), String.valueOf(value)));
//							boolQuerycasename.add(query, Occur.SHOULD);
//							continue;
//						}else{
//							query = new TermQuery(new Term(col.getColumnName(), String.valueOf(value)));
//						}
//					}
//					if(query!=null){
//						boolQuery.add(query, Occur.MUST);
//					}
//				}
//			}
//		}
//		if(!existCondition){
//		    Term term = new Term("id","**");
//		    Query query = null;
//		    query = new WildcardQuery(term);  
//		     // query = new FuzzyQuery(term);
//			boolQuery.add(query, Occur.MUST);
//		}
//		if (queryStatus) {
//			boolQuery.add(boolQuerycasename, Occur.MUST);
//		}
//		
//		return boolQuery;
//	}
//	
//	
//	private Sort getSort(OrderObj[] order,boolean isSearch){
//		/**
//		 * 
//    // 评分降序，评分一样时后索引的排前面   
//    new SortField[] { SortField.FIELD_SCORE, new SortField(null, SortField.DOC, true) }   
//    // 评分升序，评分一样时后索引的排前面，呵呵，此为最不相关的排前面，挺有趣的   
//    new SortField[] { new SortField(null, SortField.SCORE, true), new SortField(null, SortField.DOC, true) }  
//		 * */
//		// 组件排序条件语句
//		List<SortField> sortList = new ArrayList<SortField>();
//		if (order != null) {
//			for (int i = 0;i<order.length;++i) {
//				OrderObj orderObj =  order[i];
//				if(isSortName(orderObj.getOrderBy())){
//					int type = SortField.STRING;
//					if(orderObj.getOrderBy().equals("creattime")){
//						type = SortField.LONG;
//					}else if(orderObj.getOrderBy().equals("id")){
//						type = SortField.INT;
//					}/*else if(orderObj.getOrderBy().endsWith("Date")){
//						type = SortField.LONG;
//					}else if(orderObj.getOrderBy().endsWith("date")){
//						type = SortField.LONG;
//					}else if(orderObj.getOrderBy().endsWith("Time")){
//						type = SortField.LONG;
//					}else if(orderObj.getOrderBy().endsWith("time")){
//						type = SortField.LONG;
//					}*/
//					if (orderObj.getAscOrDesc().equals("desc")) {
//						sortList.add(new SortField(orderObj.getOrderBy(), type, true));
//					} else {
//						sortList.add(new SortField(orderObj.getOrderBy(), type, false));
//					}
//				}
//			}
//		} else {
//			//sortList.add(new SortField("id", SortField.INT, true));
//		}
//		Sort sort = null;
//		if(sortList!=null && sortList.size()>0){
//			sort = new Sort(sortList.toArray(new SortField[sortList.size()]));
//		}else{
//			if(isSearch){
//				sortList.add(SortField.FIELD_SCORE);
//				sortList.add(new SortField("id", SortField.INT, true));
//			}
//			try{
//				if(sortList==null ||sortList.size()<=0){
//					String sortStr = PropertiesUtil.readByKey("query_order");
//					if(!(sortStr==null || "".equals(sortStr))){
//						sortList.add(SortField.FIELD_SCORE);
//						SortField sf = new SortField(sortStr, SortField.INT, true);
//						sortList.add(sf);
//					}
//				}
//			}catch (Exception e) {
//				e.printStackTrace();
//			}
//			if(sortList!=null && sortList.size()>0){
//				sort = new Sort(sortList.toArray(new SortField[sortList.size()]));
//			}
//			//SortField sf = new SortField("id", SortField.INT, true);
//			//sort = new Sort(sf);
//		}
//		
//		return sort;
//	}
//	
//
//	@Override
//	public void add(T model) throws MyException {
//		if(!Constant.isOpenIndex()){
//			return;
//		}
//		IndexWriter writer = getWriter();
//		Document doc = getDocument(model);
//		try {
//			writer.addDocument(doc);
//			//writer.commit();
//		} catch (CorruptIndexException e) {
//			e.printStackTrace();
//			try {
//				if(writer!=null){
//					writer.rollback();
//					}
//			} catch (IOException e1) {
//				e1.printStackTrace();
//			}
//			throw new MyException(e.getMessage());
//		} catch (IOException e) {
//			e.printStackTrace();
//			try {
//				if(writer!=null){
//					writer.rollback();
//					}
//			} catch (IOException e1) {
//				e1.printStackTrace();
//			}
//			throw new MyException(e.getMessage());
//		}finally{
//			// writer.forceMerge(1);
////			if(writer!=null){
////				try {
////					writer.close();
////				} catch (Exception e2) {
////					e2.printStackTrace();
////				}
////			}
//		}
//	}
//	
//	@Override
//	public void add(List<T> caseinfos) throws MyException {
//		if(!Constant.isOpenIndex()){
//			return;
//		}
//		if(caseinfos!=null){
//			IndexWriter writer = getWriter();
//			try {
//				List<Document> list = new ArrayList<Document>(caseinfos.size());
//				for (T caseinfo : caseinfos) {
//					Document doc = getDocument(caseinfo);
//					//writer.addDocument(doc);
//					list.add(doc);
//				}
//				writer.addDocuments(list);
//				list.clear();
//				//writer.commit();
//			} catch (CorruptIndexException e) {
//				e.printStackTrace();
//				try {
//					if(writer!=null){
//						writer.rollback();
//						}
//				} catch (IOException e1) {
//					e1.printStackTrace();
//				}
//				throw new MyException(e.getMessage());
//			} catch (IOException e) {
//				e.printStackTrace();
//				try {
//					if(writer!=null){
//						writer.rollback();
//						}
//				} catch (IOException e1) {
//					e1.printStackTrace();
//				}
//				throw new MyException(e.getMessage());
//			}finally{
//				// writer.forceMerge(1);
////				if(writer!=null){
////					try {
////						writer.close();
////					} catch (Exception e2) {
////						e2.printStackTrace();
////					}
//				//writer = null;
////				}
//			}
//		}
//	}
//	private Document getDocument(T model){
//		Document doc = new Document();
//		Fieldable field = null;
//		Map<String, Object> map = BeanParameterUtil.getClassInfoForIndex(model);
//		for (Map.Entry<String, Object> entry : map.entrySet()) {
//			Object value = entry.getValue();
//			//System.out.println(entry.getKey()+":"+value);
//				if(entry.getKey().equals("id")){
//					value = String.valueOf(value);
//					field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//				}else if(value instanceof java.sql.Date){
//					//value = (String)TypeUtil.parseDate((Date)value);
//					//value = String.valueOf(((java.sql.Date)value).getTime());
//					//System.out.println(entry.getKey()+":"+value);
//					//field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					if(value==null || "".equals(value)){
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(0);
//					}else{
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(((java.sql.Date)value).getTime());
//					}
//				}else if(value instanceof java.util.Date){
//					//value = (String)TypeUtil.parseDate((java.util.Date)value);
//					//value = String.valueOf(((Date)value).getTime());
//					//System.out.println(entry.getKey()+":"+value);
//					//field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					if(value==null || "".equals(value)){
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(0);
//					}else{
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(((Date)value).getTime());
//					}
//				}else if(value instanceof Caseinfo){
//					if(value==null || "".equals(value)){
//						field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					}else{
//						Caseinfo info = (Caseinfo)value;
//						value = info.getId();
//						field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					}
//				}else if(value instanceof Userstable){
//					if(value==null || "".equals(value)){
//						field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					}else{
//						Userstable info = (Userstable)value;
//						value = info.getId();
//						field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					}
//				}else if(value instanceof Timestamp){
//					//value = (String)DateTimeUtil.timestampToString((Timestamp)value);
//					//value = String.valueOf(((Timestamp)value).getTime());
//					//System.out.println(entry.getKey()+":"+value);
//					//field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					if(value==null || "".equals(value)){
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(0);
//					}else{
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(((Timestamp)value).getTime());
//					}
//				}else if(value instanceof Time){
//					//value = (String)DateTimeUtil.timestampToString((Timestamp)value);
//					//value = String.valueOf(((Time)value).getTime());
//					//System.out.println(entry.getKey()+":"+value);
//					//field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					if(value==null || "".equals(value)){
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(0);
//					}else{
//					    field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(((Time)value).getTime());
//					}
//				}else if(value instanceof Integer){
//					//value = (String)DateTimeUtil.timestampToString((Timestamp)value);
//					//value = String.valueOf(((Time)value).getTime());
//					//System.out.println(entry.getKey()+":"+value);
//					//field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					if(value==null || "".equals(value)){
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setIntValue(0);
//					}else{
//					    field = new NumericField(entry.getKey(),Field.Store.YES, true).setIntValue(Integer.parseInt(String.valueOf(value)));
//					}
//				}else if(value instanceof Long){
//					//value = (String)DateTimeUtil.timestampToString((Timestamp)value);
//					//value = String.valueOf(((Time)value).getTime());
//					//System.out.println(entry.getKey()+":"+value);
//					//field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//					if(value==null || "".equals(value)){
//						field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(0);
//					}else{
//					    field = new NumericField(entry.getKey(),Field.Store.YES, true).setLongValue(Long.parseLong(String.valueOf(value)));
//					}
//				}else{
//					//System.out.println(entry.getKey()+":"+value);
//					field = new Field(entry.getKey(), String.valueOf(value), Field.Store.YES, Field.Index.NOT_ANALYZED);
//				}
//				if(field!=null){
//					doc.add(field);
//				}
//		}
//		field = new NumericField("creattime",Field.Store.YES, true).setLongValue(new Date().getTime());
//		//field = new Field("creattime",  String.valueOf(new Date().getTime()), Field.Store.YES, Field.Index.NOT_ANALYZED);
//		doc.add(field);
//		return doc;
//	}
//	
//	
//	@Override
//	public void deleteAll() throws MyException {
//		if(!Constant.isOpenIndex()){
//			return;
//		}
//		IndexWriter writer = getWriter();
//		try {
//			// 删除时多条记录删除
//			writer.deleteAll();
//			writer.commit();
//		} catch (Exception e) {
//			e.printStackTrace();
//			try {
//				if(writer!=null){
//					writer.rollback();
//					}
//			} catch (IOException e1) {
//				e1.printStackTrace();
//			}
//			throw new MyException(e.getMessage());
//		} finally {
////			if(writer!=null){
////				try {
////					writer.close();
////				} catch (Exception e2) {
////					e2.printStackTrace();
////				}
//				//writer = null;
////			}
//		}
//	}
//	
//	@Override
//	public void delete(Integer id) throws MyException {
//		if(!Constant.isOpenIndex()){
//			return;
//		}
//		IndexWriter writer = getWriter();
//		try {
//			// 删除时多条记录删除
//			Term term = new Term("id", String.valueOf(id.intValue()));
//			writer.deleteDocuments(term);
//			//writer.commit();
//		} catch (Exception e) {
//			e.printStackTrace();
//			try {
//				if(writer!=null){
//					writer.rollback();
//					}
//			} catch (IOException e1) {
//				e1.printStackTrace();
//			}
//			throw new MyException(e.getMessage());
//		} finally {
////			if(writer!=null){
////				try {
////					writer.close();
////				} catch (Exception e2) {
////					e2.printStackTrace();
////				}
//				//writer = null;
////			}
//		}
//	}
//	public void delete(String fkname,Integer id) throws MyException{
//		if(!Constant.isOpenIndex()){
//			return;
//		}
//		IndexWriter writer = getWriter();
//		try {
//			// 删除时多条记录删除
//			Term term = new Term(fkname, String.valueOf(id.intValue()));
//			writer.deleteDocuments(term);
//			//writer.commit();
//		} catch (Exception e) {
//			e.printStackTrace();
//			try {
//				if(writer!=null){
//					writer.rollback();
//					}
//			} catch (IOException e1) {
//				e1.printStackTrace();
//			}
//			throw new MyException(e.getMessage());
//		} finally {
////			if(writer!=null){
////				try {
////					writer.close();
////				} catch (Exception e2) {
////					e2.printStackTrace();
////				}
////				writer = null;
////			}
//		}
//	}
//	
//	
//	public boolean isExist(Integer id){
//		boolean falg = false;
//		IndexReader reader = null;
//		try {
//			reader = IndexReader.open(dir);
//		} catch (CorruptIndexException e) {
//			e.printStackTrace();
//		} catch (IOException e) {
//			e.printStackTrace();
//		}
//		IndexSearcher searcher = new IndexSearcher(reader);
//		Term term = new Term("id", String.valueOf(id.intValue()));
//		BooleanQuery boolQuery = new BooleanQuery();
//		Query query = new TermQuery(term);
//		boolQuery.add(query, Occur.MUST);
//		try {
//			TopDocs topDocs = searcher.search(boolQuery, null, 1 , null);
//			ScoreDoc[] hits = topDocs.scoreDocs;
//			if(hits!=null){
//				int DocId = hits[0].doc;
//				Document doc1 = searcher.doc(DocId);
//				String idstr = doc1.get("id");
//				Integer value  = Integer.parseInt(idstr);
//				if(id.equals(value)){
//					falg = true;
//				}
//			}
//		} catch (IOException e) {
//			e.printStackTrace();
//		}finally{
//			if(reader!=null){
//				try {
//					reader.close();
//				} catch (IOException e) {
//					e.printStackTrace();
//				}
//			}
//		}
//		return falg;
//	}
//	
//	@Override
//	public void update(T model,Integer id) throws MyException {
//		if(!Constant.isOpenIndex()){
//			return;
//		}
//		IndexWriter writer = getWriter();
//		Term term = new Term("id", String.valueOf(id.intValue()));
//		Document doc = getDocument(model);
//		try {
//			writer.updateDocument(term, doc);
//			//writer.commit();
//		} catch (CorruptIndexException e) {
//			e.printStackTrace();
//			try {
//				if(writer!=null){
//					writer.rollback();
//					}
//			} catch (IOException e1) {
//				e1.printStackTrace();
//			}
//			throw new MyException(e.getMessage());
//		} catch (IOException e) {
//			e.printStackTrace();
//			try {
//				if(writer!=null){
//				writer.rollback();
//				}
//			} catch (IOException e1) {
//				e1.printStackTrace();
//			}
//			throw new MyException(e.getMessage());
//		} finally {
////			if(writer!=null){
////				try {
////					writer.close();
////				} catch (Exception e2) {
////					e2.printStackTrace();
////				}
////				writer = null;
////			}
//		}
//	}
//	private Analyzer getAnalyzer() {
//		//return new StandardAnalyzer(Version.LUCENE_36);
//		return new IKAnalyzer();
//	}
//	public void commit() throws MyException{
//		IndexWriter writer = getWriter();
//		try {
//			writer.commit();
//		} catch (CorruptIndexException e) {
//			e.printStackTrace();
//			throw new MyException(e.getCause());
//		} catch (IOException e) {
//			e.printStackTrace();
//			throw new MyException(e.getCause());
//		}
//	}
//	
//	
//	public void rollback() throws MyException{
//		IndexWriter writer = getWriter();
//		try {
//			writer.rollback();
//		} catch (CorruptIndexException e) {
//			e.printStackTrace();
//			throw new MyException(e.getCause());
//		} catch (IOException e) {
//			e.printStackTrace();
//			throw new MyException(e.getCause());
//		}
//	}
//	private IndexWriter getWriter() {
//		try {
//			
//			synchronized(this) {
//				if(this.dir==null){
//					open();
//				}
//				if(writer==null){
//					Analyzer analyzer =  this.getAnalyzer();
//					IndexWriterConfig iwc = new IndexWriterConfig(Version.LUCENE_36, analyzer);
//					iwc.setOpenMode(IndexWriterConfig.OpenMode.CREATE_OR_APPEND);
//					writer = new IndexWriter(dir, iwc);
//				}
//			}
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//		return writer;
//	}
//	public void closeWriter() throws MyException{
//		if(writer!=null){
//			try {
//				writer.commit();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			try {
//				writer.close();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			writer = null;
//		}
//		if(dir!=null){
//			try {
//				dir.close();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			dir = null;
//		}
//	}
//	@Override
//	public void close() throws MyException {
//		if(!Constant.isOpenIndex()){
//			return;
//		}
//		if(writer!=null){
//			try {
//				writer.commit();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			try {
//				writer.close();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			writer = null;
//		}
//		if(dir!=null){
//			try {
//				dir.close();
//			} catch (IOException e) {
//				e.printStackTrace();
//			}
//			dir = null;
//		}
//	}
//
//	@Override
//	public void open() throws MyException {
//		if(!Constant.isOpenIndex()){
//			return;
//		}
//		if(dir==null){
//			try {
//				dir = FSDirectory.open(new File(getPath()));
//			} catch (IOException e) {
//				throw new MyException(e.getMessage());
//			}
//		}
//	}
//	
//	
//	public boolean isTokenName(String name){
//		boolean falg = false;
//		List<String> list = getTokenName();
//		if(list!=null &&list.size()>0){
//			for (String string : list) {
//				if(string.equals("*")||string.equals(name)){
//					falg = true;
//					break;
//				}
//			}
//		}else{
//			falg = true;
//		} 
//		return falg;
//	}
//
//	public boolean isSearchName(String name){
//		boolean falg = false;
//		List<String> list = getSearchName();
//		if(list!=null &&list.size()>0){
//			for (String string : list) {
//				if(string.equals("*")||string.equals(name)){
//					falg = true;
//					break;
//				}
//			}
//		}else{
//			falg = true;
//		}
//		return falg;
//	}
//	
//	public boolean isSortName(String name){
//		boolean falg = false;
//		List<String> list = getSortName();
//		if(list!=null &&list.size()>0){
//			for (String string : list) {
//				if(string.equals("*")||string.equals(name)){
//					falg = true;
//					break;
//				}
//			}
//		}else{
//			falg = true;
//		} 
//		return falg;
//	}
//	
//	public abstract String getPath();
//	
//	public abstract List<String> getSearchName();
//	
//	public abstract List<String> getTokenName();
//	
//	public abstract List<String> getSortName();
//	
//	public abstract T mapper(Document doc,Query query,boolean isSearch);
//	
//	public abstract Object getModel();
//
//	public Directory getDir() {
//		return dir;
//	}
//
//	public void setDir(Directory dir) {
//		this.dir = dir;
//	}
//	
//	public Object doc2map(Document doc,Object model,Query query,boolean high){
//		java.lang.reflect.Field[] fields = model.getClass().getDeclaredFields();
//		Highlighter highlight = this.getHighlighter(query);
//		Analyzer analyzer =  this.getAnalyzer();
//		for (int i = 0; i < fields.length; i++) {
//			java.lang.reflect.Field f = fields[i];
//	        f.setAccessible(true);   
//	        try {
//	        	Object val = null;
//	        	String value = doc.get(f.getName());
//	        	val = value;
//	        	if(f.getType().toString().equals("class java.lang.Integer")){
//	        		try {
//	        			if(!(value==null || "".equals(value))){
//			        		val = Integer.parseInt(value);
//	        			}
//	        		}catch (Exception e) {
//						e.printStackTrace();
//					}
//	        	}else if(f.getType().toString().equals("class java.sql.Timestamp")){
//	        		try{
//	        			val = new Timestamp(Long.parseLong(value));
//	        		}catch (Exception e) {
//					}
//	        	}else if(f.getType().toString().equals("interface java.util.List")){
//	        		val = null; 
//	        	}else if(f.getType().toString().equals("class com.harzone.investigate.model.Caseinfo")){
//	        		Caseinfo caseinfo = new Caseinfo();
//	        		java.lang.reflect.Field f1 =caseinfo.getClass().getDeclaredField("id");
//	        		f1.setAccessible(true);   
//	        		try {
//	        			if(!(value==null || "".equals(value))){
//			        		val = Integer.parseInt(value);
//			        		f1.set(caseinfo, val);
//			        		f.set(model, caseinfo);
//			        		continue;
//	        			}
//	        		}catch (Exception e) {
//						e.printStackTrace();
//					}
//	        	}else if(f.getType().toString().equals("class com.harzone.investigate.model.Userstable")){
//	        		Userstable caseinfo = new Userstable();
//	        		java.lang.reflect.Field f1 =caseinfo.getClass().getDeclaredField("id");
//	        		f1.setAccessible(true);   
//	        		try {
//	        			if(!(value==null || "".equals(value))){
//			        		val = Integer.parseInt(value);
//			        		f1.set(caseinfo, val);
//			        		f.set(model, caseinfo);
//			        		continue;
//	        			}
//	        		}catch (Exception e) {
//						e.printStackTrace();
//					}
//	        	}else if(f.getType().toString().indexOf("com.harzone.investigate.model")>-1){
//	        		val = null; 
//	        	}else if(f.getType().toString().indexOf("java.sql.Date")>-1){
//	        		try{
//	        			val = new java.sql.Date(Long.parseLong(value));
//	        		}catch (Exception e) {
//					}
//	        		
//	        	}else if(f.getType().toString().indexOf("java.util.Date")>-1){
//	        		try{
//	        			val = new java.util.Date(Long.parseLong(value));
//	        		}catch (Exception e) {
//					}
//	        	}else if(f.getType().toString().indexOf("java.sql.Time")>-1){
//	        		try{
//	        			val = new Time(Long.parseLong(value));
//	        		}catch (Exception e) {
//					}
//	        	}else if(f.getType().toString().indexOf("java.sql")>-1){
//	        		val = null; 
//	        	}else if(f.getType().toString().indexOf("java.util")>-1){
//	        		val = null; 
//	        	}else if(f.getType().toString().indexOf("java.lang.Boolean")>-1){
//	        		try {
//	        			if(!(value==null || "".equals(value))){
//		        			val = Boolean.parseBoolean(value);
//	        			}
//	        		}catch (Exception e) {
//						e.printStackTrace();
//					}
//	        	}else if(f.getType().toString().indexOf("java.lang.Long")>-1){
//	        		try {
//	        			if(!(value==null || "".equals(value))){
//		        			val = Long.parseLong(value);
//	        			}
//	        		}catch (Exception e) {
//						e.printStackTrace();
//					}
//	        	}
//	        	try {
//	        		if(!(val==null || "".equals(val))){
//	        			if(high){
//	        				try{
//	        					if(f.getType().toString().indexOf("java.lang.String")>-1){
//	        						//System.out.println(f.getName()+":"+val);
//	        						TokenStream tokenStream = analyzer.tokenStream(f.getName(), new StringReader(String.valueOf(val)));    
//			        				String valStr = highlight.getBestFragment(tokenStream, String.valueOf(val));
//			        				//System.out.println(valStr);
//			        				val = (valStr==null?val:valStr);
//	        					}
//	        				}catch (Exception e) {
//							}
//	        			}
//	                    f.set(model, val);
//	        		}
//        		}catch (Exception e) {
//        			System.out.println(f.getName()+":"+val);
//					e.printStackTrace();
//				}
//			} catch (IllegalArgumentException e) {
//				e.printStackTrace();
//			} catch (SecurityException e) {
//				e.printStackTrace();
//			} catch (NoSuchFieldException e) {
//				e.printStackTrace();
//			}  
//		}
//		return model;
//	}
//
//	public void setWriter(IndexWriter writer) {
//		this.writer = writer;
//	}
//}
